package UiLag;
import java.util.Scanner;
import KontrolLag.*;
import ModelLag.*;
import java.util.InputMismatchException;
import java.util.ArrayList;
import java.lang.Exception.*;

/**
 * Klasse som staar og UI til salgs delen i programmet
 */
public class SalgsUI
{
    private SalgCtr salgsCtr;
    private PersonUI personUI;
    private LagerUI lagerUI;
    private PersonCtr personCtr;
    private static SalgsUI instance;

    /**
     * Construktor for klassen SalgsUI
     */
    private SalgsUI()
    {
        salgsCtr = SalgCtr.getInstance();
        personUI = PersonUI.getInstance();
        lagerUI = LagerUI.getInstance();
        personCtr = PersonCtr.getInstance();

    }

    /**
     * singleton
     */
    public static SalgsUI getInstance()
    {
        if(instance == null)
        {
            instance = new SalgsUI();
        }
        return instance;
    }

    /**
     * metode som starter salgs menuen
     */
    public void start()
    {
        SalgsMenu();
    }       

    /**
     * metode som koerer menuen til salgs UI
     */
    public void SalgsMenu()
    {
        boolean exit = false;
        salgsCtr.setMedarbejder(null);
        if(salgsCtr.getMedarbejder() == null)
        {
            try
            {
                System.out.println("Du skal indtaste en medarbejders telefon nummer for at komme ind");
                salgsCtr.setMedarbejder(inputMedarbejderId());
                if(salgsCtr.getMedarbejder().getType() != "Personale")
                {
                    System.out.println("Du har ikke indtastet et medarbejder nummer, proev igen");
                    salgsCtr.setMedarbejder(inputMedarbejderId());
                    if(salgsCtr.getMedarbejder().getType() != "Personale")
                    {
                        System.out.println("Du har igen ikke indtastet et medarbejder nummer, proev igen");
                        salgsCtr.setMedarbejder(inputMedarbejderId());
                        if(salgsCtr.getMedarbejder().getType() != "Personale")
                        {
                            System.out.println("Du har ikke formaaet at indtaste et medarbejder nummer, farvel");
                            stop();
                            exit = true;
                        }

                    }
                }
                if(salgsCtr.getMedarbejder() == null)
                {
                    System.out.println(" Du skal intaste en medarbejders telefon nummer");
                    System.out.println(" Proev igen");
                    salgsCtr.setMedarbejder(inputPhone());
                    if(salgsCtr.getMedarbejder() == null)
                    {
                        exit = true;
                    }
                }
            }
            catch(IndexOutOfBoundsException i)
            {
                System.out.println("\n Du har indtastet et forkert telefon nummer");
                stop();
                exit = true;
            }
            catch(NullPointerException n)
            {
                System.out.println("Medarbejderen kunne ikke findes");
                stop();
                exit = true;
            }

        }
        while(!exit)
        {
            try
            {
                salgsCtr.lagerCheck();
            }
            catch(Exception e)
            {
                System.out.print(e);
                stop();
            }
            int choise = 0;
            try
            {
                choise = writeSalgsMenu();
            }
            catch(InputMismatchException i)
            {
                System.out.println("Fejl, du skal indtaste et tal");
                stop();
            }
            if(choise == 1)
            {
                try
                {
                    printSalg();
                }
                catch(InputMismatchException i)
                {
                    System.out.println("Et ordre nummer kan kun indeholde tal");
                    stop();
                }
                catch(NullPointerException n)
                {
                    System.out.println("Der er intet salg med det ordreNr");
                    stop();
                }
            }
            else
            {
                if(choise == 2)
                {
                    opretTilbud();
                }
                else
                {
                    if(choise == 3)
                    {
                        haandterTilbud();
                    }
                    else
                    {
                        if(choise == 4)
                        {
                            KontantSalg();
                        }                        
                        else
                        {
                            if(choise == 5)
                            {
                                try
                                {
                                    salgsCtr.sletOrdre(inputOrdreNr());
                                }
                                catch(IndexOutOfBoundsException ie)
                                {
                                    System.out.println("Der eksistere ikke nogen ordrer");
                                    stop();
                                }
                            }
                            else
                            {
                                if(choise == 6)
                                {
                                    try
                                    {

                                        statistikMedarbejder(inputPhone());
                                    }
                                    catch(NullPointerException nl)
                                    {
                                        System.out.println(" Der findes ikke en medarbejder med det telefon nummer");
                                        stop();
                                    }

                                }
                                else
                                {
                                    if(choise > 6)
                                    {
                                        exit = true;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    /**
     * metode som udskriver mulighederne til menuen
     */
    public int writeSalgsMenu()
    {      // makes an object keyboard to read input from the screen
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\f *** Salgs Menu ***");
        System.out.println(" (1) Vis information om et salg");
        System.out.println(" (2) Opret en ny ordre");
        System.out.println(" (3) Rediger et tilbud");     
        System.out.println(" (4) Lav et kontant salg");
        System.out.println(" (5) Slet en ordre");
        System.out.println(" (6) Salgs statistik");
        System.out.println(" (7) Tilbage");
        System.out.print(" foretag et valg: ");

        int choise = keyboard.nextInt();
        return choise;
    }

    /**
     * Metode som tager input til medarbejderId og retunerer dette
     * @returns medarbejderId 
     */
    public String inputMedarbejderId()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Indtast dit medarbejder(telefon nummer):  ");
        String phone = keyboard.nextLine();
        return phone;
    }

    /**
     * metode som udskriver alle informationer til et salg
     */
    public void printSalg()
    {
        long ordreNr = inputOrdreNr();
        Salg s = null;
        try
        {
            s = salgsCtr.findSalg(ordreNr);
        }
        catch(IndexOutOfBoundsException iO)
        {
            try
            {
                s = salgsCtr.findOrdre(ordreNr);
            }
            catch(IndexOutOfBoundsException ioe)
            {
                System.out.println("Der er intet salg med det ordreNr");
            }

        }

        System.out.println("\n Ordre nummer:       "+ s.getOrdreNr());
        System.out.println("Dato:               "+ s.getDato());
        System.out.println("kunde navn:         "+ s.getKunde().getName());
        System.out.println("Medarbejderns navn: "+ s.getMedarbejder().getName());
        System.out.println("################ VARER ###############");
        for(Vare v : s.getVareLinje().getVarer())
        {
            System.out.println("Varer:           "+ v.getBeskrivelse());
            System.out.println("Antal:           "+ v.getAntal());
        }
        stop();

    }

    /**
     * Metode som tager input til ordreNr og retunerer dette
     * @returns ordreNr 
     */
    public long inputOrdreNr()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Indtast ordre nummer:  ");
        long no = keyboard.nextInt();
        return no;
    }

    /**
     * Metode som tager input til dato og retunerer dette
     * @returns dato 
     */
    public String inputDato()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Dags dato:  ");
        String phone = keyboard.nextLine();
        return phone;
    }

    /**
     * Metode som tager input til salgsRabat og retunerer dette
     * @returns salgsRabat 
     */
    public long inputSalgsRabat()
    {
        // creates an object keyboard to read data from the keyboard
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\n Angiv en eventuel rabat paa salget: ");
        long no = keyboard.nextInt();
        return no;
    }

    /**
     * Metode som tager input til eanNr og retunerer dette
     * @returns eanNr 
     */
    public String inputEanNr()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Tilfoej et ean nummer:  ");
        String code = keyboard.nextLine();
        return code;
    }

    /**
     * Metode som tager input til antal og retunerer dette
     * @returns antal 
     */
    public long inputAntal()
    {
        // creates an object keyboard to read data from the keyboard
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\n Indtast det oenskede antal af varen: ");
        long no = keyboard.nextInt();
        return no;
    }

    /**
     * 
     */
    private int opretTilbudsMenu()
    {      // makes an object keyboard to read input from the screen
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\f *** Opret et nyt tilbud ***");
        udskrivMenu();

        int choise = keyboard.nextInt();
        return choise;
    }

    private int haandterTilbudsMenu()
    {      // makes an object keyboard to read input from the screen
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\f *** Haandter et eksisterende tilbud ***");
        udskrivMenu();

        int choise = keyboard.nextInt();
        return choise;
    }

    private int kontantSalgMenu()
    {      // makes an object keyboard to read input from the screen
        Scanner keyboard = new Scanner(System.in);
        System.out.println("\f *** Kontant salg menu ***");
        udskrivMenu();

        int choise = keyboard.nextInt();
        return choise;
    }

    /**
     * Metode som tager input til tlfNr og retunerer dette
     * @returns tlfNr 
     */
    public String inputPhone()
    {
        // makes an object keyboard to have input from the screen
        Scanner keyboard = new Scanner(System.in);  
        System.out.println("\n Indtast telefon nummer:  ");
        String phone = keyboard.nextLine();
        return phone;
    } 

    /**
     * Metode som giver mulighederne i menuen og koerer de relevante metode alt efter hvad der bliver valgt
     */
    public void opretTilbud()
    {
        boolean exit = false;
        Salg s = null;
        s = salgsCtr.opretSalg(0);
        if(s == null)
        {
        }
        else
        {
            long ordreNr = s.getOrdreNr();
            System.out.println("\n Intast en kundes telefon nummer");
            s.setKunde(personCtr.findPerson(inputPhone()));
            s.setMedarbejder(salgsCtr.getMedarbejder());
            while(!exit)
            {
                int choise = 0;
                try
                {

                    choise = opretTilbudsMenu();
                }
                catch(InputMismatchException im)
                {
                    System.out.println("du skal indtaste et tal mellem 1 til 6");
                    stop();
                    exit = true;

                }
                if(choise == 1)
                {
                    if(s.getVareLinje() == null)
                    {
                        VareLinje vl = new VareLinje();
                        s.tilfoejVareLinje(vl);
                    }
                    try
                    {
                        salgsCtr.tilfoejVare(ordreNr, inputEanNr(), inputAntal());
                    }
                    catch(InputMismatchException i)
                    {
                        System.out.println("Du har indtastet bogstaver, hvor der forventes tal");
                        stop();
                    }
                    catch(IndexOutOfBoundsException io)
                    {
                        System.out.println("fejl");
                        stop();
                    }
                    catch(NullPointerException ne)
                    {
                        System.out.println("Der findes ikke en varer med det ean nr");
                        stop();
                    }

                }

                if(choise == 2)
                {
                    if(s.getVareLinje() == null)
                    {
                        System.out.println(" Du har endnu ikke tilfoejet nogle varer til ordren");
                        stop();
                    }
                    else
                    {
                        try
                        {
                            salgsCtr.fjernVare(ordreNr, inputEanNr(), inputAntal());
                        }
                        catch(InputMismatchException i)
                        {
                            System.out.println("fejl, du har intastet noget forkert et sted, proev igen");
                            stop();
                        }
                        catch(IndexOutOfBoundsException io)
                        {
                            System.out.println("fejl");
                            stop();
                        }

                    }
                }

                if(choise == 3)
                {
                    try
                    {
                        s.setSalgsRabat(inputSalgsRabat());
                        if(s.getSalgsRabat() > 20)
                        {
                            System.out.println("rabatten maa ikke overstige 20%");
                            s.setSalgsRabat(0);
                            stop();
                        }
                    }
                    catch(InputMismatchException i)
                    {
                        System.out.println("En salgs rabat maa kun bestaa at tal");
                        stop();
                    }               
                }

                if(choise == 4)
                {
                    try
                    {
                        udskrivKvittering(s);
                    }
                    catch(NullPointerException ne)
                    {
                        System.out.println(" Der er ingen varer paa din ordre");
                        stop();
                    }
                }

                if(choise == 5)
                {
                    try
                    {
                        salgsCtr.fakturerOrdreTilbud(ordreNr, s.getKunde().getTelefonNummer());
                        udskrivKvittering(s);
                        exit = true;
                    }
                    catch(Exception e)
                    {

                    }
                }

                if(choise >= 6)
                {
                    exit = true;
                }
            }
        }
    }

    /**
     * Metode som giver mulighederne i menuen og koerer de relevante metode alt efter hvad der bliver valgt
     */
    public void haandterTilbud()
    {
        boolean exit = false;
        long ordreNr = inputOrdreNr();
        Salg s = null;
        try
        {
            s = salgsCtr.findOrdre(ordreNr);
        }
        catch(IndexOutOfBoundsException ib)
        {
            System.out.println("Der findes ikke nogen ordre");
            stop();
        }
        catch(NullPointerException nl)
        {
            System.out.println("der findes ikke en ordre med det ordre nummer");
            stop();
        }
        if(s == null)
        {

        }
        else
        {
            if(s.getKunde() == null)
            {
                System.out.println("En kunde skal sættes til tilbudet");
                System.out.println("Indtast en kundes telefon nummer");
                s.setKunde(personCtr.findPerson(inputPhone()));
            }
            if(s.getMedarbejder() == null)
            {
                System.out.println("En medarbejder skal sættes til tilbudet");
                s.setMedarbejder(personCtr.findPerson(inputPhone()));
            }
            while(!exit)
            {

                int choise = 0;
                try
                {
                    choise = haandterTilbudsMenu();
                }
                catch(InputMismatchException i)
                {
                    System.out.println("du har indtastet bogstaver, hvor der forventes tal");
                    stop();
                }               
                if(choise == 1)
                {
                    if(s.getVareLinje() == null)
                    {
                        VareLinje vl = new VareLinje();
                        s.tilfoejVareLinje(vl);
                    }
                    try
                    {
                        salgsCtr.tilfoejVare(ordreNr, inputEanNr(), inputAntal());
                    }
                    catch(InputMismatchException i)
                    {
                        System.out.println("");
                    }
                }

                if(choise == 2)
                {
                    if(s.getVareLinje() == null)
                    {
                        System.out.println(" Du har endnu ikke tilfoejet nogle varer til ordren");
                        stop();
                    }
                    else
                    {
                        try
                        {
                            salgsCtr.fjernVare(ordreNr, inputEanNr(), inputAntal());
                        }
                        catch(InputMismatchException i)
                        {
                            System.out.println("Du har indtastet bogstaver hvor der forventes tal");
                            stop();
                        }          
                    }  
                }

                if(choise == 3)
                {
                    s.setSalgsRabat(inputSalgsRabat());                
                }

                if(choise == 4)
                {
                    udskrivKvittering(s);
                }

                if(choise == 5)
                {
                    try
                    {
                        salgsCtr.fakturerOrdreTilbud(ordreNr, s.getKunde().getTelefonNummer());
                        udskrivKvittering(s);
                        exit = true;
                    }
                    catch(Exception e)
                    {

                    }
                }

                if(choise >= 6)
                {
                    exit = true;
                }
            }
        }
    }

    /**
     * Metode som giver mulighederne i menuen og koerer de relevante metode alt efter hvad der bliver valgt
     */
    public void KontantSalg()
    {
        boolean exit = false;
        Salg s = salgsCtr.opretSalg(0);
        long ordreNr = s.getOrdreNr();
        s.setMedarbejder(salgsCtr.getMedarbejder());
        while(!exit)
        {
            int choise = kontantSalgMenu();
            if(choise == 1)
            {
                if(s.getVareLinje() == null)
                {
                    VareLinje vl = new VareLinje();
                    s.tilfoejVareLinje(vl);
                }
                try
                {
                    salgsCtr.tilfoejVare(ordreNr, inputEanNr(), inputAntal());
                }
                catch(InputMismatchException i)
                {
                    System.out.println("Du har indtastet bogstaver hvor der forventes tal");
                    stop();
                }          
            }

            if(choise == 2)
            {
                if(s.getVareLinje() == null)
                {
                    System.out.println(" Du har endnu ikke tilfoejet nogle varer til ordren");
                    stop();
                }
                else
                {
                    try
                    {
                        salgsCtr.fjernVare(ordreNr, inputEanNr(), inputAntal());
                    }
                    catch(InputMismatchException i)
                    {
                        System.out.println("Du har endnu ikke tilfoejet nogle varer til ordren");
                        stop();
                    }          
                }
            }

            if(choise == 3)
            {
                try
                {
                    s.setSalgsRabat(inputSalgsRabat());
                    if(s.getSalgsRabat() > 20)
                    {
                        System.out.println("rabatten maa ikke overstige 20%");
                        s.setSalgsRabat(0);
                        stop();
                    }
                }
                catch(InputMismatchException i)
                {
                    System.out.println("En salgs rabat maa kun bestaa af tal");
                    stop();
                }
            }

            if(choise == 4)
            {
                udskrivKvittering(s);
            }

            if(choise >= 5)
            {
                try
                {
                    salgsCtr.fakturerOrdreKontant(ordreNr);
                    udskrivKvittering(s);
                    exit = true;
                }
                catch(Exception e)
                {

                }
            }
            if(choise == 6)
            {
                exit = true;
                salgsCtr.sletOrdre(ordreNr);
            }

        }
    }

    /**
     * Metode som udskriver statistik til en medarbejder som bliver fundet paa det angivende tlfNr
     * @param tlfNr
     */
    public void statistikMedarbejder(String tlfnr)
    {
        Person p = personCtr.findPerson(tlfnr);
        System.out.println("\n Sidste maaneds salgs statistik for "+p.getName()+" - tlfnr: "+tlfnr);
        System.out.println("Ordrenr:            Deltotal:");
        long total = 0;
        ArrayList<Salg> ordrer = salgsCtr.getPersonOrders(tlfnr);
        for(Salg ordre : ordrer)
        {
            System.out.println(ordre.getOrdreNr()+ "                "+ordre.getTotal());
            total += ordre.getTotal();
        }
        System.out.println("                Total ialt: \n" + "                "+total);
        stop();
    }
    
    /**
     * Metode som pauser programmer og fortsætter igen naar der bliver trykket paa "enter" paa tastaturet
     */
    public void stop()
    {
        System.out.println("\n Tryk enter for at gaa tilbage");
        Scanner keyboard = new Scanner(System.in);
        keyboard.nextLine();
    }

    public void udskrivKvittering(Salg s)
    { 
        System.out.println("#### DIN KVITTERING ####");
        System.out.println("Dit ordre nummer:   " + s.getOrdreNr());
        System.out.println("Dato:               " + s.getDato());
        System.out.println("");
        System.out.println("Varens navn:          Varens pris: ");
        for(Vare v : s.getVareLinje().getVarer())
        {
            System.out.println(v.getBeskrivelse()+ "                       " + v.getSalgsPris());
        }
        System.out.println("\n Den totale pris er:  " +s.getTotal());
        stop();
    }
    
    private void udskrivMenu()
    {
        System.out.println(" 1 = tilfoej varer: ");
        System.out.println(" 2 = Fjern vare: ");
        System.out.println(" 3 = set en eventuel rabat: ");
        System.out.println(" 4 = Udskriv ordre: ");
        System.out.println(" 5 = fakturer: ");
        System.out.println(" 6 = afbryd: ");
        System.out.print("\n foretag et valg: ");
        
    }

}
